#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;


struct Edge
{
	int to, rem, rid;
	Edge() : to(), rem(), rid() {}
	Edge(int _to, int _rem, int _rid) : to(_to), rem(_rem), rid(_rid) {}
};

const int maxn = 1005;
vector <Edge> g[maxn];
vector <pair<int, int> > mif;
vector <int> gr[maxn];

void clear()
{
	mif.clear();
	for (int i = 0; i < maxn; i++)
	{
		g[i].clear();
		gr[i].clear();
	}
}

void addEdge(int v, int to)
{
	g[v].push_back(Edge(to, 1, (int) g[to].size() ) );
	g[to].push_back(Edge(v, 0, (int) g[v].size() - 1) );
}


int timer = 146;
int used[maxn], usedR[maxn];

bool dfsFlow(int v, int t)
{
	if (v == t)
		return true;
	used[v] = timer;
	for (int i = 0; i < (int) g[v].size(); i++)
	{
		if (g[v][i].rem == 0)
			continue;
		int nv = g[v][i].to;
		if (used[nv] == timer)
			continue;
		if (dfsFlow(nv, t) )
		{
			g[v][i].rem--;
			g[nv][g[v][i].rid].rem++;
			return true;
		}
	}
	return false;
}


int findFlow(int s, int t)
{
	int ans = 0;
	while (true)
	{
		timer++;
		if (!dfsFlow(s, t) )
			break;
		ans++;
	}
	return ans;
}

void makeRev(int n, int t)
{
	for (int i = 0; i < n; i++)
		for (int j = 0; j < (int) g[i].size(); j++)
		{
			if (g[i][j].rem == 0)
				continue;
			int nv = g[i][j].to;
			gr[nv].push_back(i);
		}
}

void dfsRev(int v)
{
	usedR[v] = timer;
	for (int i = 0; i < (int) gr[v].size(); i++)
	{
		int nv = gr[v][i];
		if (usedR[nv] == timer)
			continue;
		dfsRev(nv);
	}
}

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	int n, m, s, t;
	while (true)
	{
		clear();
		timer++;
		scanf("%d%d%d%d", &n, &m, &s, &t);
		if (n == 0)
			break;
		s--;
		t--;
		for (int i = 0; i < m; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			a--;
			b--;
			addEdge(a, b);
			mif.push_back(make_pair(b, a) );
		}
		int curFlow = findFlow(s, t);
		makeRev(n, t);
		dfsRev(t);
		int cnt = 0;
		for (int i = 0; i < (int) mif.size(); i++)
		{
			int a = mif[i].first;
			int b = mif[i].second;
			if (used[a] == timer && usedR[b] == timer)
				cnt++;
		}
		if (cnt == 0)
			printf("%d 0\n", curFlow);
		else
			printf("%d %d\n", curFlow + 1, cnt);

	}
	return 0;
}



